// #ifndef __MY_HOT__
// #define __MY_HOT__
// #include "Util.hpp"
// #include "Data.hpp"
// #include <unistd.h>
// #include "ThreadPool.hpp"
// extern Cloud::DataManger *data;

// namespace Cloud
// {
//     class HotManger // 热点文件管理类
//     {
//     private:
//         int hot_time;
//         string pack_dir;
//         string back_dir;

//     public:
//         HotManger()
//         {

//             hot_time = Cloud::Config::GetInstance()->GetHotTiem();
//             pack_dir = Cloud::Config::GetInstance()->GetPackDir();
//             back_dir = Cloud::Config::GetInstance()->GetBackDir();
//             FileUtil tmp1(pack_dir);
//             FileUtil tmp2(back_dir);
//             tmp1.CreateDirectory();
//             tmp2.CreateDirectory();
//         }

//         bool HotJudge(const std::string &file) // 判断当前文件是否为热点文件
//         {
//             FileUtil fu(file);
//             time_t latime = fu.LastATime();
//             time_t cur_time = time(nullptr);
//             if (cur_time - latime > hot_time)
//             {
//                 return true;
//             }
//             return false;
//         }

//         static void packed(BackupInfo &info, string &realpath)
//         {
//             cout << "realpath::" << realpath << endl;
//             cout << "BackupInfo &info::" << info.packpath << endl;
//             FileUtil tmp(realpath);

//             bool ret = tmp.Compress(info.packpath);
//             if (ret == false)
//             {
//                 info.packRunning = false;
//             }
//             // 删除源文件
//             tmp.Remove();
//             info.pack_flag = true;
//             data->Update(info);
//         }

//         bool RunModule()
//         {
//             while (1)
//             {
//                 vector<string> array;
//                 FileUtil fu(back_dir);
//                 fu.ScanDirectory(&array); // 获取备份文件目录的所有文件
//                 for (int i = 0; i < array.size(); i++)
//                 {
//                     if (HotJudge(array[i]) == false)
//                         continue;
//                     BackupInfo bi;
//                     // 获取当前文件备份信息
//                     if (data->GetOneByRealpath(array[i], &bi) == false)
//                     {
//                         bi(array[i]);
//                     }

//                     packed(bi, bi.realpath);
//                 }
//                 usleep(1000);
//             }
//             return true;
//         }
//     };

// }
// #endif

#ifndef __MY_HOT__
#define __MY_HOT__
#include "Util.hpp"
#include "Data.hpp"
#include <unistd.h>
#include "ThreadPool.hpp"
extern Cloud::DataManger *data;

namespace Cloud
{
    class HotManger // 热点文件管理类
    {
    private:
        int hot_time;
        string pack_dir;
        string back_dir;
        static Cloud::ThreadPool *_threads;
        pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER;

    public:
        HotManger()
        {
            _threads = new Cloud::ThreadPool(HotManger::packed);
            _threads->Start();
            hot_time = Cloud::Config::GetInstance()->GetHotTiem();
            pack_dir = Cloud::Config::GetInstance()->GetPackDir();
            back_dir = Cloud::Config::GetInstance()->GetBackDir();
            FileUtil tmp1(pack_dir);
            FileUtil tmp2(back_dir);
            tmp1.CreateDirectory();
            tmp2.CreateDirectory();
        }
        ~HotManger()
        {
            delete _threads;
        }
        bool HotJudge(const std::string &file) // 判断当前文件是否为热点文件
        {
            FileUtil fu(file);
            time_t latime = fu.LastATime();
            time_t cur_time = time(nullptr);
            if (cur_time - latime > hot_time)
            {
                return true;
            }
            return false;
        }

        static void packed(BackupInfo info, string realpath)
        {
            // cout << "realpath::" << realpath << endl;
            // cout << "BackupInfo &info::" << info.packpath << endl;
            // cout << "BackupInfo &info::" << info.realpath << endl;
            FileUtil tmp(realpath);
            info.packRunning = true;
            data->Update(info); // 压缩前更新标志位，防止压缩过程中多次被多个线程压缩

            if (info.pack_flag == false)
            {
                bool ret = tmp.Compress(info.packpath);

                if (ret == false)
                {
                    info.packRunning = false;
                }

                // 删除源文件
                tmp.Remove();
                info.pack_flag = true;
                data->Update(info);
            }
        }

        bool RunModule()
        {
            while (1)
            {
                vector<string> array;
                FileUtil fu(back_dir);
                fu.ScanDirectory(&array); // 获取备份文件目录的所有文件
                for (int i = 0; i < array.size(); i++)
                {
                    if (HotJudge(array[i]) == false)
                        continue;
                    BackupInfo bi;
                    // 获取当前文件备份信息
                    if (data->GetOneByRealpath(array[i], &bi) == false)
                    {
                        bi(array[i]); // 设置一个新的备份信息出来
                    }

                    pthread_mutex_lock(&_mutex);
                    if (bi.pack_flag == false && bi.packRunning == false)
                    {
                        bi.packRunning = true;
                        _threads->addTask(bi, bi.realpath);
                    }
                    pthread_mutex_unlock(&_mutex);
                    // sleep(1);
                    //  packed(bi, bi.realpath);
                }
                usleep(1000);
            }
            return true;
        }
    };
    ThreadPool *Cloud::HotManger::_threads = nullptr;
}
#endif